草庐IT

c++ - Swig -includeall 除了...

全部标签

c++ - 包含 .c 文件和 .h 文件有什么区别

很多时候,当我看其他人的代码时,我看到有些包含.h文件,有些包含.c/.cpp文件。有什么区别? 最佳答案 这取决于文件中的内容。#include预处理器指令只是将引用的文件插入原始文件中的那个位置。因此,实际的编译器阶段(在预处理器之后运行)看到的是所有插入的结果。头文件通常设计为通过#include使用。源文件不是,但有时是有道理的。例如,当您有一个仅包含定义和初始化程序的C文件时:constuint8_timage[]={128,128,0,0,0,0,...lotsmore...};然后通过使用#include使它对某些代码

c++ - 如何在C/C++中实现确定性多线程?

众所周知,线程作为一种计算模型是不确定的。然而,在某些情况下,我们希望利用多线程并行计算带来的性能提升,同时保持执行的确定性,以便于满足一些通用需求,例如调试或一些特定需求。我知道可以为特定任务实现确定性多线程,但我期待一种通用且优雅的方式(也就是说,不需要大量琐碎的工程工作)在C/C++中实现它。什么类型的解决方案并不重要:可以通过某些库、某些平台、某些通用方法或任何其他方式来实现它。 最佳答案 您实现确定性多线程的方式与您拥有可变常量的方式相同——但事实并非如此。相反,您使用各种形式的同步(包括互斥锁、信号量、条件变量、信号等)

c++ - 如何将二维数组相互分配?

组件我有一个字符串,例如字符block[4][256]="";我有一句话charsentence[256]="Bobwalkedhisdog";我还有一个迭代器变量intpos=0;我正在努力实现的目标我正在尝试将数组sentence中的每个单词按顺序分配到二维block数组block中。例如,假设我有这段代码(我自己写的-没有按我的计划工作)for(intx=0;x我怎么看我通过处理这个问题来看待它的方式是,我需要先扫描句子,直到遇到一个空格''字符,一个空白。遇到这种情况后,我必须重新扫描句子并开始将所有字符添加到该空格''的位置到我的block数组block[y][z]的第一段中

c++ - 当 JSON 中存在非法字符时,如何防止 JSON 解析器崩溃?

由于一些通信错误,我有时会收到带有一些非法字符的JSON字符串:"{messageType\":\"Test1\",\"from\":\"F2D0B5C6-9875-46B5-8D4F\"}����1"这些非法字符使我的JSON解析器崩溃。我正在使用RapidJSONJSON解析器(C/C++)。你能告诉我是否有一种方法可以从字符串中过滤掉这些不需要的字符并验证json字符串的完整性。 最佳答案 这不是解析器中的错误。解析器验证空终止符之前的尾随字符是否为空格。并在发生错误时返回错误代码。但是如果没有空终止符,可能会导致段错误,类似

c++ - XOR 交换算法中运算符的未定义行为?

voidswap(int*a,int*b){if(a!=b)*a^=*b^=*a^=*b;}因为上面的*a^=*b^=*a^=*b只是*a=*a^(*b=*b^(*a=*a^*b)),可以(例如)在第三个*a之前对第二个*a进行求值(对于XOR)修改(由=)?用C99/C11/C++98/C++11写有关系吗? 最佳答案 C++11标准说:5.17/1:Theassignmentoperator(=)andthecompoundassignmentoperatorsallgroupright-to-left.(...)theassi

c++ - 参数列表中的 C 函数声明

我在C代码中发现了一些令人困惑的东西structSomeStruct{//...void(*f)(constvoid*x);};voiddo_some(voidf(constvoid*x)){//what?structSomeStruct*v;//...v->f=f;}据我所知,do_some采用函数而不是函数指针。但是voiddo_some(void(*f)(constvoid*x))在实践中有什么区别?我应该什么时候使用它?这在C++中允许吗? 最佳答案 没有区别。这只是语法糖。它在C和C++中都是允许的。函数参数只是被编译器重

c++ - 将 char[][] 转换为 char**

我有一个char[][]charc[2][2]={{'a','b'},{'c','d'}};如何将其转换为char**?此处的目标是使用转换后的char**作为main函数的输入,该函数只接受char**作为其输入。两种C/C++解决方案都是可以接受的。 最佳答案 虽然您可以轻松地从char[]切换到char*,但char[][]和字符**:您的char[2][2]是一个二维数组,所有元素都连续存储。为了访问一个元素,编译器计算知道每一行大小的偏移量。char**指向一个包含指向char的指针的数组。要访问一个元素,您的编译器会计算

c++ - extern 和 extern "C"用于变量

我正在编写供C程序使用的C++共享库。但是,我对extern和extern"C"有疑问。考虑以下代码我的头文件是这样的:#ifdef__cplusplusextern"C"intglobal;extern"C"intaddnumbers(inta,intb);#elseexternintglobal;#endif这很好用;我只需要声明intglobal;在我的.cpp或我的.c文件中。但是,我不明白的是:extern"C"和extern有什么区别?我尝试注释掉extern"C"intglobal并且有效!为什么?我知道extern"C"用于建立C链接。这就是为什么我有extern"C"

c++ - 在运行时本地启用/禁用 OpenMP

是否可以在运行时启用或禁用OpenMP并行化?我有一些代码应该在某些情况下并行运行,而不是在不同情况下并行运行。同时,其他线程中的其他计算也使用OpenMP,应该始终并行运行。有没有办法告诉OpenMP不要在当前线程中并行化?我知道omp_set_num_threads,但我假设全局设置OpenMP使用的线程数。 最佳答案 您可以使用的替代方法是将if条件添加到#pragmaomp结构中。只要条件为假,这些将跳过对从编译指示派生的OpenMP运行时调用的调用。考虑以下使用基于变量t和f(分别为true和false)的条件的程序:#i

c++ - 为什么 gcc 不为我决定内联或不内联这个功能?

从网上的一些话我知道GCC很聪明,可以决定是否内联一个函数。inline关键字只是一个提示:GCC可以内联一个普通函数,而不能内联一个内联函数。但是对于我项目中的这个功能:structvb_pos{union{struct{intoffset;intl;};unsignedlonglongg_offset;};};staticinlinevoidvi_write_vtail_smart(structvi*vi){structvb_pos*vhead,*vtail,*cursor;vhead=&vi->v_head;vtail=&vi->v_tail;cursor=&vi->cursor